(dired-unmark-all-files): Read arg as just a character.
authorRichard M. Stallman <rms@gnu.org>
Sun, 6 Jun 1993 21:13:16 +0000 (21:13 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 6 Jun 1993 21:13:16 +0000 (21:13 +0000)
Use non-regexp search to find a specific mark.
Use subst-char-in-region to make the change.
Improve the message at the end.

lisp/dired.el

index 9d0fd907eea3687be664c4a0ac517c21a93497ac..4cdc1dab066c8d1d1b792dee564ecc435f386439 100644 (file)
@@ -1770,26 +1770,32 @@ OLD and NEW are both characters used to mark files."
                                (match-end 0) old new))))))
 
 (defun dired-unmark-all-files (mark &optional arg)
-  "Remove a specific mark or any mark from every file.
+  "Remove a specific mark (or any mark) from every file.
+After this command, type the mark character to remove, 
+or type RET to remove all marks.
 With prefix arg, query for each marked file.
 Type \\[help-command] at that time for help."
-  (interactive "sRemove marks (RET means all): \nP")
-  (let ((count 0)
-       (re (if (zerop (length mark)) dired-re-mark
-             (concat "^" (regexp-quote mark)))))
-    (save-excursion
-      (let (buffer-read-only case-fold-search query
-                            (help-form "\
+  (interactive "cRemove marks (RET means all): \nP")
+  (save-excursion
+    (let* ((count 0)
+          buffer-read-only case-fold-search query
+          (string (format "\n%c" mark))
+          (help-form "\
 Type SPC or `y' to unmark one file, DEL or `n' to skip to next,
 `!' to unmark all remaining files with no more questions."))
-       (goto-char (point-min))
-       (while (re-search-forward re nil t)
-         (if (or (not arg)
-                 (dired-query 'query "Unmark file `%s'? "
-                              (dired-get-filename t)))
-             (progn (delete-char -1) (insert " ") (setq count (1+ count))))
-         (forward-line 1))))
-    (message "%s" (format "Marks removed: %d %s" count mark))))
+      (goto-char (point-min))
+      (while (if (eq mark ?\r)
+                (re-search-forward dired-re-mark nil t)
+              (search-forward string nil t))
+       (if (or (not arg)
+               (dired-query 'query "Unmark file `%s'? "
+                            (dired-get-filename t)))
+           (progn (subst-char-in-region (1- (point)) (point)
+                                        (preceding-char) ?\ )
+                  (setq count (1+ count)))))
+      (message (if (= count 1) "1 mark removed"
+                "%d marks removed")
+              count))))
 \f
 ;; Logging failures operating on files, and showing the results.